package com.xiangge;

import java.io.*;

public class MyClass4 implements Serializable {
    // 定义由私人权限修饰符修饰的属性
    private int id;

    // 序列化ID，用于版本控制
    private static final long serialVersionUID = 1L;

    // 创建满参构造方法
    public MyClass4(int id) {
        this.id = id;
    }

    // Getter 和 Setter 方法
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    // 进行方法重写
    @Override
    public String toString() {
        return "MyClass{" + "id=" + id + '}';
    }

    // 使用序列化机制创建对象的副本
    public MyClass4 cloneUsingSerialization() throws IOException, ClassNotFoundException {
        // 创建一个字节数组输出流，用于将数据写入内存
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        // 创建一个对象输出流，将对象序列化到字节数组输出流
        ObjectOutputStream out = new ObjectOutputStream(byteOut);
        // 将当前对象写入输出流
        out.writeObject(this);
        // 刷新输出流并关闭
        out.flush();
        out.close();

        // 从字节数组输出流中获取序列化后的数据
        byte[] serializedData = byteOut.toByteArray();

        // 创建一个字节数组输入流，用于从内存读取数据
        ByteArrayInputStream byteIn = new ByteArrayInputStream(serializedData);
        // 创建一个对象输入流，从字节数组输入流中读取并反序列化对象
        ObjectInputStream in = new ObjectInputStream(byteIn);
        // 读取对象并返回
        return (MyClass4) in.readObject();
    }

    public static void main(String[] args) {
        try {
            // 创建并初始化原始对象
            MyClass4 originalMyClass = new MyClass4(1);
            // 使用序列化机制创建对象的副本
            MyClass4 clonedMyClass = originalMyClass.cloneUsingSerialization();

            // 输出原始对象和克隆对象
            System.out.println(originalMyClass); // 输出：MyClass{id=1}
            System.out.println(clonedMyClass); // 输出：MyClass{id=1}

            // 修改克隆对象的id值，以证明两个对象是独立的
            clonedMyClass.setId(2);

            // 再次输出以确认修改
            System.out.println(originalMyClass); // 输出：MyClass{id=1}，原始对象的id值没有改变
            System.out.println(clonedMyClass); // 输出：MyClass{id=2}，克隆对象的id值已经改变

        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}